package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author ：sean
 * @date ：Created in 2022/5/23
 * @description ：购物车控制器
 * @version: 1.0
 */
@RequestMapping("/shoppingCart")
@Slf4j
@RestController
public class ShoppingCartController {

	@Autowired
	private ShoppingCartService cartService;

	// 方法：名称、参数、返回值(R<String>)
	@PostMapping("/add")
	public R<ShoppingCart> add(@RequestBody ShoppingCart cart){
		log.info("[购物车-添加],cart:{}",cart);
		// 业务逻辑分析，确定添加购物车做做哪些事情
		// cart对象，目前缺什么？用户ID，确定数量，创建时间（没有自动填充）
		// 1.获取用户Id ,从哪里获取登录用户的ID（session或ThreadLocal
		// 用户Id,C端用，谁在买，与后台用户没有关系
		Long userId = BaseContext.getCurrentId();
		cart.setUserId(userId);
		// 购物车里面，可能套餐（ID），可能是菜品（ID)，同一时刻，要么是菜品，要么套餐
		// 2.我们需要确定当前添加的是否是菜品或套餐，

		// 构建查询条件，确定是基于菜品查询，还是套餐查询
		LambdaQueryWrapper<ShoppingCart> cartLambdaQueryWrapper = new LambdaQueryWrapper<>();
		if(cart.getDishId() !=null){
			// 当前是菜品
			cartLambdaQueryWrapper.eq(ShoppingCart::getDishId,cart.getDishId());
		}else{
			// 当前是套餐
			cartLambdaQueryWrapper.eq(ShoppingCart::getSetmealId,cart.getSetmealId());
		}
		ShoppingCart cartOne = cartService.getOne(cartLambdaQueryWrapper);
		if(cartOne != null){
			// 2.1 如果查到有这个菜品或套餐，说明什么？只需要添加数量就可以
			// 2,2+1,3
			cartOne.setNumber(cartOne.getNumber()+1);
			// 更新数据库
			cartService.updateById(cartOne);
		}else{
			// cartOne null
			// 2.2 没有查到，说明什么？说明是需要新增
			// 用户Id 确定数量，创建时间（没有自动填充）
			cart.setNumber(1);
			cart.setCreateTime(LocalDateTime.now());
			// 保存数据库
			cartService.save(cart);
			cartOne = cart;
		}
		// 最终需要数据保存到购物车表（结果）
		return R.success(cartOne);
	}
	// 购物车列表
	// 千万不能传参，否则就是漏洞
	@GetMapping("/list")
	public R<List<ShoppingCart>> list(){
		log.info("[购物车-列表]，无参");
		// 思路：如何查询购物车列表
		// 根据登录的用户ID，去购物车表中查询
		// select * from shopping_cart where user_id = ?
		// 缺少用户ID？，肯定登录的用户ID
		Long userId = BaseContext.getCurrentId();
		// 调用业务对，查询购物车列表,一般按什么顺序排（不确定，需求没有明确类别顺序）
		LambdaQueryWrapper<ShoppingCart> cartLambdaQueryWrapper
			= new LambdaQueryWrapper<>();
		cartLambdaQueryWrapper.eq(ShoppingCart::getUserId,userId);
		cartLambdaQueryWrapper.orderByAsc(ShoppingCart::getCreateTime);
		List<ShoppingCart> shoppingCartList = cartService.list(cartLambdaQueryWrapper);
		return R.success(shoppingCartList);
	}

	// 清空购物车
	@DeleteMapping("/clean")
	public R<String> clean(){
		// 如何清空，对应哪种表
		// 思路：根据用户ID，删除数据
		Long userId = BaseContext.getCurrentId();
		// 调用业务对，查询购物车列表,一般按什么顺序排（不确定，需求没有明确类别顺序）
		LambdaQueryWrapper<ShoppingCart> cartLambdaQueryWrapper
			= new LambdaQueryWrapper<>();
		cartLambdaQueryWrapper.eq(ShoppingCart::getUserId,userId);
		cartService.remove(cartLambdaQueryWrapper);
		return R.success("清空购物车成功");
	}
}
